package com.niit.scala

/**
 * Date:2025/4/8
 * Author：Ys
 * Description:
 */
object Base10 {

  def main(args: Array[String]): Unit = {
    /*
      模式匹配：
       1. 简单的模式匹配
       2.匹配类型
       3.模式匹配的守卫
       4.匹配样例类
       5.匹配集合
       6.变量声明中的模式匹配
       7.匹配for循环表达式
     */
    //1.简单的模式匹配
    //需求： 输入 Hadoop或者Spark 分别显示两者的简介信息，如果输入其他的则显示未匹配
    var str = "Hadoop"
    var res = str match {
      case "Hadoop" => "Hadoop是一个分布式计算框架"
      case "Spark" => "Spark是大数据分布式内存计算框架"
      case _ => "未匹配"
    }
   println(res)
    //2.匹配类型
    val i:Any = 999
    i match {
      case i:String => println("i是字符串")
      //已知case后面的变量名是固定，所以可以使用_来占位
      case _:Int => println("i是整数")
      case _:Double => println("i是浮点数")
      case _ => println("i是未知类型")
    }
    //3.模式匹配的守卫  case _ if 条件 => 匹配成功执行的代码
    //输入一个数，获得这个数所在的区间
    var num = 3
    num match {
      case num if num>=0 && num<=10 => println("区间为[0,10]")
      case num if num>10 && num<=20 => println("区间为[10,20]")
      case num if num>20 && num<=30 => println("区间为[20,30]")
      case _ => println("未知区间")
    }

    //4.匹配样例类
    //样例类中的参数，在模式匹配中编写的字段个数要和该样例类的字段个数保持一致
    var c:Any = Customer("张三", 20)
    var o:Any = Order(1)
    var arr:Any = Array(1,2)

    c match {
      case Customer(a, b) => println(" Customer 匹配成功")
      case Order(c) => println(" Order匹配成功")
      case _ => println("未知匹配")
    }

    //5.1匹配集合  数组
    var arr1 = Array(1,2,3)
    var arr2 = Array(0)
    var arr3 = Array(1,2,3,4,5)

    arr3 match {
      //匹配：长度为3 首元素为1
      case Array(1,x,y) => println("长度为3 首元素为1")
      //匹配：只有一个元素 且为0
      case Array(0) => println("只有一个元素 且为0")
      //匹配：首元素为1，后面元素任意
      case Array(1,_*) => println("首元素为1，后面元素任意")
      case _ => println("未知匹配")
    }

    //5.2匹配集合  列表
    var list1 = List(0)
    var list2 = List(0,1,2,3,4,5)
    var list3 = List(1,2)
    list3 match {
      //匹配只有一个元素，且为0
      case List(0) => println("只有一个元素，且为0")
      //匹配首元素为0，后面的元素任意
      case List(0,_*) => println("首元素为0，后面的元素任意")
      //匹配只有两个元素的列表
      case List(a,b) => println("只有两个元素的列表")
      case _ => println("未知匹配")
    }
    //list 利用关键字符表达式进行匹配
    list3 match {
      //匹配只有一个元素，且为0
      case 0::Nil => println("只有一个元素，且为0")
      //匹配首元素为0，后面的元素任意
      case 0::tail => println("首元素为0，后面的元素任意")
      //匹配只有两个元素的列表
      case a::b::Nil => println("只有两个元素的列表")
      case _ => println("未知匹配")
    }

    //6.变量声明中的模式匹配
    //需求：生成1-10的数组，去获得 第二、三、四 元素
    var arr4 = ( 1 to 10).toArray
    val Array(_,x,y,z,_*) = arr4
    println(x,y,z)
    //需求：生成1-10的列表，去获得 第一 二 元素
    var list4 = (1 to 10).toList
    //方式一
    var List(a,b,_*) = list4
    println(a,b)
    //方式二
    var n::m::tail = list4
    println(n,m)

    //7.匹配for表达式
    // 定义变量记录学生的姓名和年龄，获得年龄为23的学生信息
    var map1 = Map( "张三"->23, "李四"->24, "王五"->25 )
    //传统方式 for循环的守卫
    for( (k,v) <- map1 if v==23 ){
      println(k,v)
    }

    //固定值的方式
    for( (k,23) <- map1 ){
      println(k,23)
    }

    /*
    options: 在实际开发中，难免会出现空指针的问题，在Scala中可以通过options类型去避免空指针
    Options又两个可选值
      1.Some :表示实际值
      2.None: 表示空值
     */

    val r = div(10, 0)
    println(r)
  }

  def div(a:Int,b:Int) = {
    if(b==0){
      None
    }else{
      Some(a/b)
    }
  }


  case class Customer(name:String,age:Int)
  case class Order(id:Int)
}
